#ifndef __PLATFORM_LIB_LOG_H__
#define __PLATFORM_LIB_LOG_H__
#ifdef __cplusplus
extern "C"
{
#endif

#include <limits.h>
#include <stdarg.h>
#include <linux/limits.h>

#include "pf_common.h"

/******************************************************************************************************/

#define pf_log_trace(module, format, ...)    pf_log_write(module, __FILE__, __LINE__, PF_LOG_TRACE, format, ##__VA_ARGS__);
#define pf_log_debug(module, format, ...)    pf_log_write(module, __FILE__, __LINE__, PF_LOG_DEBUG, format, ##__VA_ARGS__);
#define pf_log_info(module, format, ...)    pf_log_write(module, __FILE__, __LINE__, PF_LOG_INFO, format, ##__VA_ARGS__);
#define pf_log_warn(module, format, ...)    pf_log_write(module, __FILE__, __LINE__, PF_LOG_WARN, format, ##__VA_ARGS__);
#define pf_log_error(module, format, ...)    pf_log_write(module, __FILE__, __LINE__, PF_LOG_ERROR, format, ##__VA_ARGS__);
#define pf_log_fatal(module, format, ...)    pf_log_write(module, __FILE__, __LINE__, PF_LOG_FATAL, format, ##__VA_ARGS__);

/******************************************************************************************************/

typedef struct pf_log_config
{
    char        log_path[PATH_MAX]; /* log dir */
    char        log_file[NAME_MAX]; /* log file prefix */
    uint16_t    log_level;          /* output log level */
    uint32_t    time_zone;          /* local time zone (GMT+8 should be 8) */
}pf_log_config_t;

/* default log level
   higher level, more important */
enum PF_LOG_LEVEL_VALUE
{
    PF_LOG_TRACE = 0,               /* trace run path */
    PF_LOG_DEBUG = 10,              /* debug */
    PF_LOG_INFO  = 100,             /* runtime infomation */
    PF_LOG_WARN  = 1000,            /* some error but can fix or ignore it */
    PF_LOG_ERROR = 10000,           /* error */

    PF_LOG_FATAL = 65535,           /* fatal, maybe need to reboot */
};

/*********************************************************************************************
Function Name:  pf_log_init_config
Description  :  Help to init pf_log_config_t
Inputs       :  pf_log_config_t* config        :
Outputs      :  return value                   : None.
ErrorCodes   :
History      :
---------------------------------------------------------------------------------------------
Author                 Date                          Comments
yanghz                 2011-06-25                    create
**********************************************************************************************/
extern void pf_log_init_config(pf_log_config_t* config);

/*********************************************************************************************
Function Name:  pf_log_init
Description  :  Init log
Inputs       :  pf_log_config_t* config        :
Outputs      :  return value                   : 
ErrorCodes   :
History      :
---------------------------------------------------------------------------------------------
Author                 Date                          Comments
yanghz                 2011-06-25                    create
**********************************************************************************************/
extern int pf_log_init(const pf_log_config_t* config);

/*********************************************************************************************
Function Name:  pf_log_write
Description  :  Write log. If write log before init, it will print to stderr.
Inputs       :  const char* module             :
                const char* file               :
                int line                       :
                uint16_t level                 :
                const char* format             :
                ...                            :
Outputs      :  return value                   : 
ErrorCodes   :
History      :
---------------------------------------------------------------------------------------------
Author                 Date                          Comments
yanghz                 2011-06-25                    create
**********************************************************************************************/
extern void pf_log_write(const char* module, 
                         const char* file, 
                         int line, 
                         uint16_t level, 
                         const char* format, 
                         ...);

/*********************************************************************************************
Function Name:  pf_log_writev
Description  :  Write log. If write log before init, it will print to stderr.
Inputs       :  const char* module             :
                const char* file               :
                int line                       :
                uint16_t level                 :
                const char* format             :
                va_list ap                     :
Outputs      :  return value                   : 
ErrorCodes   :
History      :
---------------------------------------------------------------------------------------------
Author                 Date                          Comments
yanghz                 2011-06-25                    create
**********************************************************************************************/
extern void pf_log_writev(const char* module, 
                          const char* file, 
                          int line, 
                          uint16_t level, 
                          const char* format, 
                          va_list ap);

/******************************************************************************************************/

#ifdef __cplusplus
}
#endif
#endif /* #ifndef __PLATFORM_LIB_LOG_H__ */

